From 1b5a9e18bc04368e48ed06bd2cb8258508d089a0 Mon Sep 17 00:00:00 2001 From: George Dunlap Date: Tue, 26 Jul 2011 18:37:16 +0100 Subject: [PATCH] xen: Option to allow per-device vector maps for MSI IRQs Add a vector-map to pci_dev, and add an option to point MSI-related IRQs to the vector-map of the device. This prevents irqs from the same device from being assigned the same vector on different pcpus. This is required for systems using an AMD IOMMU, since the intremap tables on AMD only look at vector, and not destination ID. Signed-off-by: George Dunlap --- xen/arch/x86/irq.c | 6 ++++++ xen/include/xen/pci.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index f02ab0c9cf..dbd5978622 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -32,6 +32,9 @@ unsigned int __read_mostly nr_irqs_gsi = 16; unsigned int __read_mostly nr_irqs; integer_param("nr_irqs", nr_irqs); +bool_t __read_mostly opt_irq_perdev_vector_map = 0; +boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map); + u8 __read_mostly *irq_vector; struct irq_desc __read_mostly *irq_desc = NULL; @@ -1654,6 +1657,9 @@ int map_domain_pirq( dprintk(XENLOG_G_ERR, "dom%d: irq %d in use\n", d->domain_id, irq); desc->handler = &pci_msi_type; + if ( opt_irq_perdev_vector_map + && !desc->chip_data->used_vectors ) + desc->chip_data->used_vectors = &pdev->info.used_vectors; set_domain_irq_pirq(d, irq, info); setup_msi_irq(pdev, msi_desc, irq); spin_unlock_irqrestore(&desc->lock, flags); diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 6313c388a3..25bd415d2a 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -11,6 +11,7 @@ #include #include #include +#include /* * The PCI interface treats multi-function devices as independent @@ -38,6 +39,7 @@ struct pci_dev_info { u8 bus; u8 devfn; } physfn; + vmask_t used_vectors; }; struct pci_dev { -- 2.30.2